#include <stdio.h>
#include <unistd.h>
#include <string.h>

//在这个示例中，首先创建一个管道，然后通过fork创建子进程。父进程向管道写入数据，子
//进程从管道读取数据并打印出来。注意，在使用管道时，需要正确地关闭不需要的管道端以避免
//出现错误。
int main(){
    int pipefd[2];
    pid_t pid;

    //创建管道
    if(pipe(pipefd) == -1){
        perror("pipe");
        return 1;
    }
    //创建一个子进程
    pid = fork();

    if(pid == -1){
        perror("fork");
        return 1;
    }else if(pid == 0){
        //子进程
        close(pipefd[1]);   //关闭子进程的写端
        char buffer[100];
        ssize_t bytesRead = read(pipefd[0],buffer,sizeof(buffer));
        if(bytesRead == -1){
            perror("read in child");
            return 1;
        }
        buffer[bytesRead] = '\0';
        printf("Child received:%s\n",buffer);

        close(pipefd[0]);
    }else{
        //父进程
        close(pipefd[0]);   //关闭父进程的读端

        const char *message ="Hello from parent!";
        ssize_t byteWritten = write(pipefd[1],message,strlen(message));
        if(byteWritten == -1){
            perror("write in parent");
            return 1;
        }
        close(pipefd[1]);
    }
    return 0;
}